home *** CD-ROM | disk | FTP | other *** search
/ Windows News 2010 Summer - Disc 1 / WN_Ete2010_CD1.iso / Onglet5 / Weezo / Weezo setup.exe / {code_appDir} / www / includes / initFunctions.php < prev    next >
PHP Script  |  2010-05-19  |  44KB  |  1,059 lines

  1. <?php
  2. /**
  3.  * Logged user session initialisation
  4.  *
  5.  * load resource data, language data, protected dirs...
  6.  *
  7.  * PHP version 5
  8.  *
  9.  * LICENSE: This source file is subject to version 3.0 of the PHP license
  10.  * that is available through the world-wide-web at the following URI:
  11.  * http://www.php.net/license/3_0.txt.  If you did not receive a copy of
  12.  * the PHP License and are unable to obtain it through the web, please
  13.  * send a note to license@php.net so we can mail you a copy immediately.
  14.  *
  15.  * @category   NA
  16.  * @package    NA
  17.  * @author     Nicolas Bruley / Peer 2 World <contact@weezo.net>
  18.  * @copyright  2005-2009 Nicolas Bruley / Peer 2 World
  19.  * @license    http://www.php.net/license/3_0.txt  PHP License 3.0
  20.  * @version    CVS: $Id:$
  21.  * @link       http://www.weezo.net
  22.  * @since      File available since Release 1.0.0
  23.  */
  24.  
  25.  
  26. /**
  27.  * @desc Kill CMD consol launched by Weezo (to set path env) as it's not anymore usefull
  28.  *
  29.  */
  30. function ifKillParentCmd(){
  31.     $myPID=getmypid();
  32.     foreach(customParentPIDs() as $child=>$tmp){
  33.         list($parent,$exeName)=explode(':',$tmp);
  34.         $proc[$child]=array('exe'=>$exeName,'parent'=>$parent);
  35.         if($child==$myPID) $parentPID=$parent;
  36.     }
  37.     if($parent=@$proc[$proc[$parentPID]['parent']]['exe']=='cmd.exe') customTerminateProcess($proc[$parentPID]['parent'],false);
  38. }
  39.  
  40. /**
  41.  * @desc Statistics reporting
  42.  *
  43.  */
  44. function ifStatsReport(){
  45.     // Stats class
  46.     class stats{
  47.         static $stats=array();
  48.  
  49.         function add($k,$v=null){
  50.             if($v===null) $v=cfGGetVar($k);
  51.             if($v===true) $v='true';
  52.             elseif($v===false) $v='false';
  53.             $this->stats[$k]=$v;
  54.         }
  55.  
  56.         function get(){
  57.             return $this->stats;
  58.         }
  59.     }
  60.     $s=new stats();
  61.  
  62.     // General
  63.     $s->add('theme');
  64.     $s->add('serverPort');
  65.     $s->add('webPagesCompressionLevel');
  66.     $s->add('uploadMaxFilesize');
  67.     $s->add('skin');
  68.     $s->add('noPopup');
  69.     $s->add('startWithWindows');
  70.     $s->add('UPnPEnabled');
  71.     $s->add('UPnPFailure');
  72.     $s->add('UPnPFailure');
  73.     $s->add('UPnPFailure');
  74.     $s->add('loginMessage',((cfGGetVar('loginMessage'))?true:false));
  75.  
  76.     // user stats
  77.     $userHint=$userPassword=$users=$userTheme=$userHidden=0;
  78.     $userNbResources=0;
  79.     foreach (cfMGetVar('weezoUsers') as $k=>$user) if(!@$user['invisible']){
  80.         $users++;
  81.         if(@$user['hidden']) $userHidden++;
  82.         if(@$user['password']) $userPassword++;
  83.         if(@$user['theme']) $userTheme++;
  84.         $i=0;
  85.         while (isset($user['resource'.$i])) $i++;
  86.         $userNbResources+=$i;
  87.     }
  88.     $s->add('users',$users);
  89.     $s->add('userHint',$userHint);
  90.     $s->add('userPassword',$userPassword);
  91.     $s->add('userTheme',$userTheme);
  92.     $s->add('userHidden',$userHidden);
  93.     $s->add('userNbResources',$userNbResources);
  94.  
  95.     // Resources stats
  96.     $res=array();
  97.     foreach (cfMGetVar('weezoResourcesList') as $id=>$filename){
  98.         $r=cfMGetVar('weezoResData'.$id);
  99.         @$res[$r['subType']]++;
  100.     }
  101.     foreach ($res as $subtype=>$nb) $s->add('res'.$subtype,$nb);
  102.  
  103.     // Send report to dev server
  104.     cfSocketHTTPRequest('http://dev.weezo.net/report.php?config='+base64_encode(serialize($s->get())),3);
  105. }
  106.  
  107. /**
  108.  * @desc Return an array containing resource definition
  109.  *
  110.  * @param string $type
  111.  * @param string $subType
  112.  */
  113. function ifResourceDefinition($type,$subType){
  114.     $baseFile=false;
  115.     $res=array('type'=>$type,'subType'=>$subType);
  116.     $desriberFile=cfAppDocRoot().'/res/'.$type.'/'.$subType.'/describer.ini';
  117.  
  118.     // Base file
  119.     if(file_exists($desriberFile)) {
  120.         // Look for describer.ini file, and parse it
  121.         $res['describer']=array();
  122.         $res['describer']=cfParse_ini_file($desriberFile);
  123.         // Look for base file in describer
  124.         if(isset($res['describer']['baseFile']) && file_exists(cfAppDocRoot().'/res/'.$res['type'].'/'.$res['subType'].'/'.$res['describer']['baseFile'])) $baseFile=$res['describer']['baseFile'];
  125.     }
  126.     // if base file not found in describer, set it to index.php
  127.     if(!$baseFile) {if(file_exists(cfAppDocRoot().'/res/'.$res['type'].'/'.$res['subType'].'/index.php')) $baseFile='index.php'; else return false;} // If no base file found, exit
  128.     $res['baseFile']=$baseFile;
  129.  
  130.     // Script path
  131.     $res['resourceScriptPath']='/res/'.$res['type'].'/'.$res['subType'];
  132.  
  133.     // resource icons
  134.  
  135.     /**
  136.      * 32x32 icon
  137.      */
  138.     if(isset($res['describer']['iconFile'])){
  139.         // 1st look for png
  140.         if(file_exists(cfAppDocRoot().$res['resourceScriptPath'].'/'.$res['describer']['iconFile'].'.png'))
  141.             $res['resourceIcon']=$res['resourceScriptPath'].'/'.$res['describer']['iconFile'].'.png';
  142.         // then for gif
  143.         elseif (file_exists(cfAppDocRoot().$res['resourceScriptPath'].'/'.$res['describer']['iconFile'].'.gif'))
  144.             $res['resourceIcon']=$res['resourceScriptPath'].'/'.$res['describer']['iconFile'].'.gif';
  145.         // then for jpg
  146.         elseif (file_exists(cfAppDocRoot().$res['resourceScriptPath'].'/'.$res['describer']['iconFile'].'.jpg'))
  147.             $res['resourceIcon']=$res['resourceScriptPath'].'/'.$res['describer']['iconFile'].'.jpg';
  148.     }
  149.     // if 32x32 resource icon not yet found
  150.     if(!isset($res['resourceIcon'])){
  151.         // look for resourceIcon.png
  152.         if(file_exists(cfAppDocRoot().$res['resourceScriptPath'].'/resourceIcon.png'))
  153.             $res['resourceIcon']=$res['resourceScriptPath'].'/resourceIcon.png';
  154.         // then look for resourceIcon.gif
  155.         elseif(file_exists(cfAppDocRoot().$res['resourceScriptPath'].'/resourceIcon.gif'))
  156.             $res['resourceIcon']=$res['resourceScriptPath'].'/resourceIcon.gif';
  157.         // then look for resourceIcon.jpg
  158.         elseif(file_exists(cfAppDocRoot().$res['resourceScriptPath'].'/resourceIcon.jpg'))
  159.             $res['resourceIcon']=$res['resourceScriptPath'].'/resourceIcon.jpg';
  160.         // then look in upperdir for resourceIcon.gif
  161.         elseif(file_exists(cfAppDocRoot().'/res/'.$res['type'].'/resourceIcon.gif'))
  162.             $res['resourceIcon']='/res/'.$res['type'].'/resourceIcon.gif';
  163.         else $res['resourceIcon']=false;
  164.     }
  165.  
  166.     /**
  167.      * 16x16 icon
  168.      */
  169.     if(isset($res['describer']['iconSmallFile'])){
  170.         // 1st look for png
  171.         if(file_exists(cfAppDocRoot().$res['resourceScriptPath'].'/'.$res['describer']['iconSmallFile'].'.png'))
  172.             $res['resourceIconSmall']=$res['resourceScriptPath'].'/'.$res['describer']['iconSmallFile'].'.png';
  173.         // then for gif
  174.         elseif (file_exists(cfAppDocRoot().$res['resourceScriptPath'].'/'.$res['describer']['iconSmallFile'].'.gif'))
  175.             $res['resourceIconSmall']=$res['resourceScriptPath'].'/'.$res['describer']['iconSmallFile'].'.gif';
  176.         // then for jpg
  177.         elseif (file_exists(cfAppDocRoot().$res['resourceScriptPath'].'/'.$res['describer']['iconSmallFile'].'.jpg'))
  178.             $res['resourceIconSmall']=$res['resourceScriptPath'].'/'.$res['describer']['iconSmallFile'].'.jpg';
  179.     }
  180.     // if 16x16 resource icon not yet found
  181.     if(!isset($res['resourceIconSmall'])){
  182.         // look for resourceIconSmall.png
  183.         if(file_exists(cfAppDocRoot().$res['resourceScriptPath'].'/resourceIconSmall.png'))
  184.             $res['resourceIconSmall']=$res['resourceScriptPath'].'/resourceIconSmall.png';
  185.         // then look for resourceIconSmall.gif
  186.         elseif(file_exists(cfAppDocRoot().$res['resourceScriptPath'].'/resourceIconSmall.gif'))
  187.             $res['resourceIconSmall']=$res['resourceScriptPath'].'/resourceIconSmall.gif';
  188.         // then look for resourceIconSmall.jpg
  189.         elseif(file_exists(cfAppDocRoot().$res['resourceScriptPath'].'/resourceIconSmall.jpg'))
  190.             $res['resourceIconSmall']=$res['resourceScriptPath'].'/resourceIconSmall.jpg';
  191.         // then look in upperdir for resourceIconSmall.png
  192.         elseif(file_exists(cfAppDocRoot().'/res/'.$res['type'].'/resourceIconSmall.png'))
  193.             $res['resourceIconSmall']='/res/'.$res['type'].'/resourceIconSmall.png';
  194.         // then look in upperdir for resourceIconSmall.gif
  195.         elseif(file_exists(cfAppDocRoot().'/res/'.$res['type'].'/resourceIconSmall.gif'))
  196.             $res['resourceIconSmall']='/res/'.$res['type'].'/resourceIconSmall.gif';
  197.         else $res['resourceIconSmall']=false;
  198.     }
  199.  
  200.     // resourceTypeLabel
  201.     if(isset($res['describer'][cfGGetVar('language')]['name'])) $res['resourceTypeLabel']=$res['describer'][cfGGetVar('language')]['name'];
  202.     elseif(isset($res['describer']['en']['name'])) $res['resourceTypeLabel']=$res['describer']['en']['name'];
  203.     else $res['resourceTypeLabel']=cfUTF8Decode(cfCaption('res'.ucfirst($res['type'])));
  204.  
  205.     // resourcePreviewImage
  206.     if(isset($res['describer']['previewImage'])) $res['resourcePreviewImage']=$res['resourceScriptPath'].'/'.$res['describer']['previewImage'];
  207.     elseif (file_exists(cfAppDocRoot().$res['resourceScriptPath'].'/preview.jpg')) $res['resourcePreviewImage']=$res['resourceScriptPath'].'/preview.jpg';
  208.     else $res['resourcePreviewImage']=false;
  209.  
  210.     // resourceDescription
  211.     if(cfCaptionExist($res['type'].'_'.$res['subType'].'-description')) $res['resourceDescription']=cfCaption($res['type'].'_'.$res['subType'].'-description');
  212.     elseif(isset($res['describer'][cfGGetVar('language')]['description'])) $res['resourceDescription']=$res['describer'][cfGGetVar('language')]['description'];
  213.     elseif(isset($res['describer']['en']['description'])) $res['resourceDescription']=$res['describer']['en']['description'];
  214.     else $res['resourceDescription']=cfCaption('genNoDescription',false,false,false,true);
  215.  
  216.     // resourceConfigFile
  217.     if(isset($res['describer']['configFile'])) $res['resourceConfigFile']=$res['describer']['configFile'];
  218.     elseif (file_exists(cfAppDocRoot().$res['resourceScriptPath'].'/config.php')) $res['resourceConfigFile']='config.php';
  219.     else $res['resourceConfigFile']=false;
  220.  
  221.     // Separate sessions as default option for misc extensions
  222.     if(!isset($res['describer']['resourceStartsSession']) && $res['type']=='misc') $res['describer']['resourceStartsSession']=true;
  223.  
  224.     // resourceStartsSession: if true, close weezo session before begining of resource script
  225.     if(isset($res['describer']['resourceStartsSession'])) $res['resourceStartsSession']=$res['describer']['resourceStartsSession'];
  226.     else $res['resourceStartsSession']=false;
  227.  
  228.     // separateWindow: if true, open resource in a separate window
  229.     if(isset($res['describer']['separateWindow'])) $res['separateWindow']=$res['describer']['separateWindow'];
  230.  
  231.     // UI config file: if set, open this script into UI (or remote admin) config window
  232.     if(isset($res['describer']['configFile'])) $res['configFile']=$res['describer']['configFile'];
  233.  
  234.     // remote config file: if set, create a button in window title bar to go to this administration page (for administrator only)
  235.     if(isset($res['describer']['remoteConfigFile'])) $res['remoteConfigFile']=$res['describer']['remoteConfigFile'];
  236.  
  237.     // singleInstance: if set, allow creation of a single instance of this resource
  238.     if(isset($res['describer']['singleInstance'])) $res['singleInstance']=$res['describer']['singleInstance'];
  239.  
  240.     return $res;
  241. }
  242.  
  243. /**
  244.  * @desc Load resources definitions into weezoResourcesDefinitionstypesubtype memory arrays
  245.  *
  246.  */
  247. function ifResourcesDefinitions(){
  248.     $res=array();
  249.     foreach (cfGlob(cfAppDocRoot().'/res/*') as $cfn0) if(is_dir($cfn0)){
  250.         $type=basename($cfn0);
  251.         foreach (cfGlob($cfn0.'/*') as $cfn) if(is_dir($cfn)){
  252.             $subType=basename($cfn);
  253.             // Load resource definition
  254.             if($r=ifResourceDefinition($type,$subType))    {
  255.                 $res[$type][$subType]='weezoResourceDefinition'.strtolower($type).strtolower($subType);
  256.                 cfMSetVar($res[$type][$subType],$r);
  257.             }
  258.         }
  259.     }
  260.     cfMSetVar('weezoResourcesDefinitions',$res);
  261. }
  262.  
  263. /**
  264.  * @return array : resource array (or false if resource not loaded)
  265.  * @param string : $resourceID of loaded resource
  266.  * @param string : $resourceFileName : name of .res resource file located in data path
  267.  * @desc load resource in array : from data path / $resourceFileName
  268.  *
  269.  *     common resources parameters:
  270.  *
  271.  * version : version of file
  272.  * resourceName : name of resource (filename without extension)
  273.  * name : "label" of resource
  274.  * type : type of resource
  275.  * subType : sub type of resource
  276.  * baseFile : main script file name (without path)
  277.  * resourceScriptPath : path (from document root) to resource script(s)
  278.  * resourceDataDir : path to resource data directory
  279.  * resourceIcon : path (from document root) to resource's icon
  280.  * resourceIconSmall : path (from document root) to 16x16 resource's icon
  281.  * resourceJsLink : javascript link to main resource script
  282.  * resourceTypeLabel : label of resource as specified in resource's desciber file or, if not found, resource's type label
  283.  * resourcePreviewImage (optional) : path (from document root) to resource's preview image
  284.  * resourceDescription (optional) : path (from document root) to resource's description (read from describer.ini file)
  285.  * resourceStartsSession : true if resource doesn't need a wSession_start from security.php script
  286.  * resourceConfigFile : (optional) resource configuration script name
  287.  
  288. */
  289. function ifLoadResource($resourceFileName,$res=false){
  290.     // If file doesn't exist, (try to) remove from existing in-memory resources
  291.     if(!file_exists(cfAppDataDir() . '/' . $resourceFileName)) return false;
  292.     /*
  293.         foreach (cfResourcesGetUser() as $id=>$data) if($data['resourceName'].'.res'==$resourceFileName) {cfMUnsetVar('weezoResData'.$data['id']); break;}
  294.         return false;
  295.     }
  296.     */
  297.     // Parse resource file
  298.     if(!$res) $res = cfParse_ini_file(cfAppDataDir().'/'.$resourceFileName);
  299.  
  300.     // Misc controls on parsed file content
  301.     if(!$res || count($res)==0) return false;
  302.     if(!isset($res['type']) || !isset($res['subType']) || !file_exists(cfAppDocRoot().'/res/'.$res['type'].'/'.$res['subType'])) return false;
  303.  
  304.     // Get type/subtype resource definition
  305.     $res=array('definition'=>ifResourceDefinition($res['type'],$res['subType']))+$res;
  306.  
  307.     // resourceName (filename without extention)
  308.     $res['resourceName']=cfFileWithoutExtension($resourceFileName);
  309.     $res['resourceFilename']=$resourceFileName;
  310.  
  311.     // recompose subpaths of application path
  312.     if(isset($res['path']) && substr($res['path'],0,8)=='*appDir*') $res['path']=cfAppDataRootDir().substr($res['path'],8);
  313.     if(isset($res['bookmarksPath']) && substr($res['bookmarksPath'],0,8)=='*appDir*') $res['bookmarksPath']=cfAppDataRootDir().substr($res['bookmarksPath'],8);
  314.  
  315.     // resourceDataDir
  316.     //if resource sub type dir doesn't exists, create it
  317.     $dataDir=cfAppDataDir()."/res/".$res['type']."/".$res['subType'];
  318.     if(!file_exists($dataDir)) {
  319.         if(!file_exists(cfAppDataDir()."/res/".$res['type'])) @mkdir(cfAppDataDir()."/res/".$res['type']);
  320.         @mkdir($dataDir);
  321.     }
  322.     $dataDir=cfAppDataDir()."/res/".$res['type']."/".$res['subType']."/".$res['resourceName'];
  323.     //if(!file_exists($dataDir)) mkdir($dataDir); //if resource data dir doesn't exists, create it
  324.     $res['resourceDataDir']=$dataDir;
  325.  
  326.     // Add timestamp of last update, used by resources to detect configuration updates
  327.     $res['memUpdate']=time();
  328.  
  329.     // Save resource data in memory
  330.     cfMSetVar('weezoResData'.$res['id'],$res);
  331.  
  332.     // Update resources list
  333.     $rl=cfMGetVar('weezoResourcesList'); if(!$rl) $rl=array();
  334.     $rl[$res['id']]=$resourceFileName;
  335.     cfMSetVar('weezoResourcesList',$rl);
  336.  
  337.     return true;
  338. }
  339.  
  340. /**
  341.  * @desc Load all resources into memory
  342.  *
  343.  */
  344. function ifLoadResources(){
  345.     // Destroy previous resources data in memory
  346.     if($r=cfMGetVar('weezoResourcesList')){
  347.         foreach ($r as $id=>$filename) @cfMUnsetVar('weezoResData'.$id);
  348.         unset($r);
  349.         cfMUnsetVar('weezoResourcesList');
  350.     }
  351.  
  352.     // Reload resources
  353.     $retries=0;
  354.     while($retries<5){ // Sometimes resources get lost. phenomenon has not been explained yet, so do a check at the end and retry up to 5 times
  355.         $nb=0;
  356.         foreach (cfGlob(cfAppDataDir().'/*.res') as $resourceCompleteFilename) {
  357.             if(ifLoadResource(basename($resourceCompleteFilename))) $nb++;
  358.         }
  359.         // Check weezoResourcesList contains the right number of resources
  360.         if($nb<>count(cfMGetVar('weezoResourcesList'))) $retries++; else break;
  361.     }
  362. }
  363.  
  364. /**
  365.  * @desc load user ($_SESSION['user']) resources in $_SESSION['res'][resource number][field name] array
  366.  * @return number of loaded resources
  367. */
  368. function ifLoadUserResources() {
  369.     $nbResources=0;
  370.     $resourceRed=0;
  371.     $activeItems=array(); // array containing resource's icons positions
  372.     $addedResourcesFilenames=array(); // Array of added resources filenames, used to prevent double resource loading
  373.  
  374.     // Load all resources
  375.     $resources=cfResourcesGetAll();
  376.  
  377.     // Standalone resource
  378.     if(isset($_SESSION['user']['publishToken'])){
  379.         foreach ($resources as $id=>$resourceData) if(@$resourceData['publishToken']==$_SESSION['user']['publishToken']) {
  380.             $_SESSION['res'][0]=array(
  381.                 'id'=>$id,
  382.                 'type'=>$resourceData['type'],
  383.                 'subType'=>$resourceData['subType'],
  384.                 'resourceJsLink'=>'/res/'.$resourceData['type'].'/'.$resourceData['subType'].'/'.$resourceData['definition']['baseFile'].'?resId=0',
  385.                 'resourceIcon'=>$resourceData['definition']['resourceIcon']);
  386.             return 1;
  387.         }
  388.         die('ifLoadUserResources error: resource not found');
  389.     }
  390.  
  391.     // Browse resources listed in user .usr file
  392.     while(isset($_SESSION['user']['resource'.$resourceRed]['file'])){
  393.         $temp=cfUGetVar('resource'.$resourceRed);
  394.         // Check that resource .res file exists
  395.         if(isset($temp['file']) && !isset($addedResourcesFilenames[$temp['file']])){
  396.             if(isset($_SESSION['res'][$nbResources])) unset($_SESSION['res'][$nbResources]);
  397.             // Search in all memory-loaded resources the one matching filename
  398.             foreach($resources as $uniqueID=>$resourceData){
  399.                 // The right one...
  400.                 if(isset($resourceData['resourceName']) && $resourceData['resourceName'].'.res'==$temp['file']){
  401.  
  402.                     // Last control: verify that browser supports this resource
  403.                     if(isset($resourceData['type']) && isset($resourceData['subType']) && stripos($resourceData['type'].'/'.$resourceData['subType'],cfBGetVar('unavailableResources'))===false){
  404.                         $opt=array();
  405.                         if(isset($resourceData['defaultWindowWidth'])) $opt['dWW']=$resourceData['defaultWindowWidth'];
  406.                         if(isset($resourceData['defaultWindowHeight'])) $opt['dWH']=$resourceData['defaultWindowHeight'];
  407.                         if(isset($resourceData['winInnerWidth'])) $opt['dIH']=$resourceData['winInnerWidth'];
  408.                         if(isset($resourceData['winInnerHeight'])) $opt['dIH']=$resourceData['winInnerHeight'];
  409.                         if(@$resourceData['separateWindow']||@$resourceData['definition']['separateWindow']) $opt['separateWindow']=1;
  410.                         if(@$_SESSION['user']['administrator'] && @$resourceData['definition']['remoteConfigFile'])
  411.                             $opt['remoteConfigFile']='/res/'.$resourceData['type'].'/'.$resourceData['subType'].'/'.$resourceData['definition']['remoteConfigFile'];
  412.  
  413.                         $options='';foreach ($opt as $k=>$v) $options.=",'".$k."':'".$v."'"; $options='{'.substr($options,1)."}";
  414.  
  415.                         // ADD RESOURCE to resources list
  416.                         // NOTE: resource creation also present in ifResetResourcesUsers()
  417.                         $_SESSION['res'][$nbResources]=array(
  418.                             // unique ID
  419.                             'id'=>$uniqueID,
  420.                             'type'=>$resourceData['type'],
  421.                             'subType'=>$resourceData['subType'],
  422.                             'resourceIcon'=>$resourceData['definition']['resourceIcon'],
  423.                             // resourceJsLink
  424.                             'resourceJsLink'=>'openResource(\''.$resourceData['definition']['resourceScriptPath'].'/'.$resourceData['definition']['baseFile'].'\',\''.$nbResources."','".
  425.                             str_replace('\\',"\\\\",str_replace("'","`",str_replace('"',""",cfUTF8Encode($resourceData['name']))))."','".
  426.                             $resourceData['definition']['resourceIcon']."',".$options.')');
  427.  
  428.                         // Set background icons position according to iconPosition data
  429.                         $activeItems[$uniqueID]=array('name'=>'resIcon_'.$uniqueID, 'type'=>'icon', 'x'=>null, 'y'=>null, 'resourceFilename'=>$temp['file']);
  430.                         if(isset($temp['iconPosition'])) {
  431.                             @list($x,$y)=@explode('x', trim($temp['iconPosition']));
  432.                             if($x && $y && is_numeric($x) && is_numeric($y))
  433.                                 $activeItems[$uniqueID]['x']=$x;
  434.                                 $activeItems[$uniqueID]['y']=$y;
  435.                         }
  436.  
  437.                         $addedResourcesFilenames[$temp['file']]=1;
  438.                         $nbResources++;
  439.                         break;
  440.                     }
  441.                 }
  442.             }
  443.         }
  444.         $resourceRed++;
  445.     }
  446.     cfGSetVar('activeItems',$activeItems);
  447.     if($nbResources==0) cfLog('login.php: No resource loaded !',LOG_ER); else cfLog('login.php: user configuration file loaded. '.$nbResources.' resource(s) loaded', LOG_DBG);
  448.     return $nbResources;
  449. }
  450.  
  451. /**
  452.  * @desc load general.ini and language files into memory
  453.  *             Called at first script call after apache start-up, and every time general.ini file is modified
  454.  *
  455.  */
  456. function ifLoadGeneral(){
  457.     $dir=cfAppDataDir();
  458.     $_ENV['weezoGeneral']=array();
  459.     if(file_exists($dir.'/general.ini')) $_ENV['weezoGeneral']=cfParse_ini_file($dir."/general.ini", true);
  460.     if(!count($_ENV['weezoGeneral'])) {
  461.         echo "Internal Server Error : missing ini files";
  462.         cfLog('Internal Server Error : missing ini files',LOG_ER, true);
  463.         exit;
  464.     }
  465.     cfLog('initFunctions.php: general.ini loaded',LOG_DBG);
  466.  
  467.     // Store User Interface language in a separate var so it can be easily differentiated from browser language stored into 'language' G var
  468.     $_ENV['weezoGeneral']['languageUI']=@$_ENV['weezoGeneral']['language'];
  469.  
  470.     // Add system directories to protected dir
  471.     $_ENV['weezoGeneral']['protectedDirs']=array();
  472.     if(isset($_ENV['weezoGeneral']['protectSensitiveFolders']) && $_ENV['weezoGeneral']['protectSensitiveFolders']  && strtolower($_ENV['weezoGeneral']['protectSensitiveFolders'])!='false'){
  473.         $_ENV['weezoGeneral']['protectedDirs'][] = strtolower(strtr(getenv('systemroot'),"\\","/"));
  474.         $_ENV['weezoGeneral']['protectedDirs'][] = strtolower(substr($_SERVER['DOCUMENT_ROOT'],0,strlen($_SERVER['DOCUMENT_ROOT'])));
  475.         $_ENV['weezoGeneral']['protectedDirs'][] = strtolower(substr($_SERVER['DOCUMENT_ROOT'],0,strlen($_SERVER['DOCUMENT_ROOT'])-3)."data");
  476.         $_ENV['weezoGeneral']['protectedDirs'][] = strtolower(substr($_SERVER['DOCUMENT_ROOT'],0,strlen($_SERVER['DOCUMENT_ROOT'])-3)."bin");
  477.         $_ENV['weezoGeneral']['protectedDirs'][] = strtolower(substr($_SERVER['DOCUMENT_ROOT'],0,strlen($_SERVER['DOCUMENT_ROOT'])-3)."Apache");
  478.         $_ENV['weezoGeneral']['protectedDirs'][] = strtolower(substr($_SERVER['DOCUMENT_ROOT'],0,strlen($_SERVER['DOCUMENT_ROOT'])-3)."PHP");
  479.     }
  480.  
  481.     // Compatibility with V<2.0: transform [userX] arrays into users comma separated list
  482.     $i=0;
  483.     if(!@$_ENV['weezoGeneral']['users']) while (isset($_ENV['weezoGeneral']['user'.$i]['file'])){
  484.         $files[]=$_ENV['weezoGeneral']['user'.$i]['file'];
  485.         unset($_ENV['weezoGeneral']['user'.$i]);
  486.         $i++;
  487.     }
  488.     if($i) $_ENV['weezoGeneral']['users']=implode(',',$files);
  489.  
  490.  
  491.     // Store data in memory
  492.     cfMSetVar('weezoGeneral',$_ENV['weezoGeneral']);
  493.  
  494.     // Set system codepage (used for utf8 encoding/decoding)
  495.     if(!isset($_ENV['weezoGeneral']['systemCodepage'])) $_ENV['weezoGeneral']['systemCodepage']='1252';
  496.     cfMSetVar('systemCodepage','windows-'.$_ENV['weezoGeneral']['systemCodepage']);
  497. }
  498.  
  499. /**
  500.  * @desc load .usr users files into memory
  501.  *          Called at first script call after apache start-up, and every time an user file is modified
  502.  *
  503.  */
  504. function ifLoadUsers(){
  505.     $files=array();
  506.     $adminFound=false;
  507.     $usersOrder='';
  508.  
  509.     // Get a filename=>id resources array
  510.     $resourcesList=cfArraySwapKeysValues(cfMGetVar('weezoResourcesList'));
  511.  
  512.     // New users storage method (V2.0): get ordered users list from "users" var in general.ini. List of users filenames, comma separated
  513.     if(cfGGetVar('users')) foreach (explode(',',cfGGetVar('users')) as $filename) $files[]=trim($filename);
  514.  
  515.     // Load users from files
  516.     foreach ($files as $filename)  if(file_exists(cfAppDataDir().'/'.$filename)) {
  517.         $usr=cfParse_ini_file(cfAppDataDir().'/'.$filename);
  518.         if(!isset($usr['id'])) continue;
  519.  
  520.         // Verify that all resources exists and are not affected twice
  521.         $inexistingFound=0;
  522.         $addedResourcesFilenames=array();
  523.         for($i=0;isset($usr['resource'.$i]);$i++){
  524.             // If an inexisting resource is found, or resource is already added
  525.             if(!isset($resourcesList[$usr['resource'.$i]['file']]) || isset($addedResourcesFilenames[$usr['resource'.$i]['file']])){
  526.                 $inexistingFound=true;
  527.                 // move all following resources one step down
  528.                 for($o=$i+1;isset($usr['resource'.$o]);$o++)    $usr['resource'.($o-1)]=$usr['resource'.$o];
  529.                 unset($usr['resource'.($o-1)]);
  530.             }
  531.             $addedResourcesFilenames[$usr['resource'.$i]['file']]=1;
  532.         }
  533.         $usr['configFilename']=$filename;
  534.         $users[$usr['id']]=$usr;
  535.         if(@$usr['administrator']) $adminFound=true;
  536.         $usersOrder.=(($usersOrder)?',':'').$filename;
  537.  
  538.         // If an inexisting resource has been removed, commit to (user) file
  539.         if($inexistingFound) cfWriteIniFile($usr,cfAppDataDir().'/'.$filename);
  540.     }
  541.  
  542.     // If no administrator found and application already configured, regen an admin
  543.     if(!$adminFound && cfGGetVar('applicationConfigured')){
  544.         $admin=new WUserConfig();
  545.         $admin->setVar('name',cfUTF8Decode(cfCaption('userAdministrator')));
  546.         $admin->setVar('administrator',true);
  547.         $admin->setVar('authenticationMethod','password');
  548.         $admin->setVar('password','?');
  549.         $admin->save();
  550.         $usersOrder.=(($usersOrder)?',':'').$admin->filename();
  551.     }
  552.  
  553.     // Add user used for standalone resource connections
  554.     $users['standalone']=array(
  555.         'id'=>'standalone',
  556.         'name'=>cfUTF8Decode(cfCaption('publishResourceLabel')),
  557.         'invisible'=>true,
  558.         'administrator'=>false,
  559.         'activated'=>true,
  560.         'accountType'=>'anonymous',
  561.         'icon'=>'globo',
  562.         'authenticationMethod'=>'publishToken'
  563.     );
  564.  
  565.  
  566.     // Store data in memory
  567.     cfMSetVar('weezoUsers',$users);
  568.  
  569.     // Modified list (upgrade from V1.3.0X to V2) or problem: update general.ini
  570.     if($usersOrder!=cfGGetVar('users')) cfGUpdateVar('users',$usersOrder);
  571. }
  572.  
  573. /**
  574.  * @desc load theme data into memory, from data of themes/theme_name/menu.php
  575.  *
  576.  */
  577. function ifLoadThemes(){
  578.     $themes=array();
  579.     $dir=cfAppDocRoot().'/themes';
  580.  
  581.     if($handle = opendir($dir)) {
  582.         // Browse www/themes subdirs for theme files (theme.css)
  583.         while (($file = @readdir($handle))!==false) {
  584.             $completeFileName=$dir.'/'.$file;
  585.             if(is_dir($completeFileName) && file_exists($completeFileName.'/theme.css')){
  586.                 // Set default values
  587.                 $themes[$file]=array();
  588.                 $themes[$file]['output']='normal';
  589.                 $themes[$file]['frames']=true;
  590.                 $themes[$file]['screenSize']='monitor';
  591.                 $themes[$file]['winEmptyHTML']=false;
  592.                 $themes[$file]['menuFrame']=array('position'=>'no', 'size'=>'0', 'scrolling'=>'no');
  593.                 $themes[$file]['mainFrame']=array('extraHeader'=>false, 'bodyExtraHTML'=>false,'winBorderWidth'=>0,'winBorderHeight'=>0);
  594.  
  595.                 // Set theme main properties (use frames, screenSize, output type)
  596.                 if(file_exists($completeFileName.'/menu.php')){
  597.                     $theme=array();
  598.                     require($completeFileName.'/menu.php');
  599.                     foreach ($theme as $key=>$value) {
  600.                         if(!is_array($value)) $themes[$file][$key]=$value;
  601.                         else foreach ($value as $key2=>$value2) {
  602.                             $themes[$file][$key][$key2]=$value2;
  603.                         }
  604.                     }
  605.                 }
  606.                 $themes[$file]['path']='/themes/'.$file;
  607.                 $themes[$file]['dir']=cfAppDocRoot().'/themes/'.$file;
  608.             }
  609.         }
  610.         $file='skins/default';
  611.         $completeFileName=$dir.'/'.$file;
  612.         $themes[$file]=array();
  613.  
  614.         $themes[$file]['path']='/themes/'.$file;
  615.         $themes[$file]['dir']=cfAppDocRoot().'/themes/'.$file;
  616.         $themes[$file]['private']=true;
  617.         closedir($handle);
  618.     }
  619.  
  620.     // Savec into memory
  621.     cfMSetVar('weezoThemes',$themes);
  622. }
  623.  
  624. /**
  625.  * @desc Create an array caching icons locations, uset by outIcon function
  626.  *
  627.  */
  628. function ifLoadIcons(){
  629.     $weezoIcons=array();
  630.     // Get all icons located into /gfx and /gfx/fi
  631.     $icons=array_merge(
  632.         glob(cfAppDocRoot().'/gfx/*.{gif,png}',GLOB_BRACE),
  633.         glob(cfAppDocRoot().'/gfx/fi/med/*.{gif,png}',GLOB_BRACE),
  634.         glob(cfAppDocRoot().'/gfx/fi/big/*.{gif,png}',GLOB_BRACE),
  635.         glob(cfAppDocRoot().'/gfx/browsers/*.{gif,png}',GLOB_BRACE),
  636.         glob(cfAppDocRoot().'/gfx/fi/*.{gif,png}',GLOB_BRACE));
  637.     // Copy icons list into a iconName=>iconPath array
  638.     foreach ($icons as $key=>$value) $ref[cfFileWithoutExtension(substr($value,strlen(cfAppDocRoot())+5))]=substr($value,strlen(cfAppDocRoot()));
  639.     foreach ($ref as $iconName=>$value) if(isset($icons[$iconName.'.png']) && isset($icons[$iconName.'.gif'])) $ref[$iconName]=$iconName.'.png';
  640.     unset($icons);
  641.  
  642.     // Get all icons located into themes directories
  643.     $themes=cfMGetVar('weezoThemes');
  644.  
  645.     foreach ($themes as $themeName=>$themeValue){
  646.         $tIcons[$themeName]=array_merge(
  647.             glob(cfAppDocRoot().'/themes/'.$themeName.'/*.{gif,png}',GLOB_BRACE),
  648.             glob(cfAppDocRoot().'/themes/'.$themeName.'/fi/*.{gif,png}',GLOB_BRACE),
  649.             glob(cfAppDocRoot().'/themes/'.$themeName.'/fi/med/*.{gif,png}',GLOB_BRACE));
  650.  
  651.         // Copy icons list into a iconName=>iconPath array
  652.         $tmp=array();
  653.         foreach ($tIcons[$themeName] as $key=>$value) $tmp[cfFileWithoutExtension(substr($value,strlen(cfAppDocRoot().'/themes/'.$themeName.'/')))]=substr($value,strlen(cfAppDocRoot()));
  654.         foreach ($tmp as $iconName=>$value) if(isset($tIcons[$themeName][$iconName.'.png']) && isset($tIcons[$themeName][$iconName.'.gif'])) $tmp[$iconName]=$iconName.'.png'; // Prefer png over gif
  655.         $tIcons[$themeName]=$tmp;
  656.         $weezoIcons[$themeName]=$tmp;
  657.     }
  658.  
  659.     // set icons per theme
  660.     foreach ($ref as $iconName=>$value){
  661.         foreach ($themes as $themeName=>$themeValue){
  662.             if(isset($tIcons[$themeName][$iconName]) && substr($tIcons[$themeName][$iconName],-3)=='png')
  663.                 $weezoIcons[$themeName][$iconName]='/themes/'.$themeName.'/'.$iconName.'.png';
  664.             elseif(isset($tIcons[$themeName][$iconName]) && substr($tIcons[$themeName][$iconName],-3)=='gif')
  665.                 $weezoIcons[$themeName][$iconName]='/themes/'.$themeName.'/'.$iconName.'.gif';
  666.             else
  667.                 $weezoIcons[$themeName][$iconName]=$ref[$iconName];
  668.         }
  669.     }
  670.  
  671.     // Replace iPhone & Wii icons by mobile icons (but keep device specific icons)
  672.     foreach ($weezoIcons['mobile'] as $iconName=>$iconPath){
  673.         if(!isset($weezoIcons['iPhone'][$iconName]) || substr($weezoIcons['iPhone'][$iconName],0,4)=='/gfx') $weezoIcons['iPhone'][$iconName]=$iconPath;
  674.         if(!isset($weezoIcons['wiizo'][$iconName]) || substr($weezoIcons['wiizo'][$iconName],0,4)=='/gfx') $weezoIcons['wiizo'][$iconName]=$iconPath;
  675.     }
  676.     cfMSetVar('weezoIcons',$weezoIcons);
  677.  
  678.  
  679.     // Build an array of per file extension icons
  680.     $extIcons=array();
  681.     foreach (cfGlob(cfAppDocRoot().'/gfx/ext/*.png') as $cfn) $extIcons[basename($cfn)]=1;
  682.     cfMSetVar('extensionIcons',$extIcons);
  683. }
  684.  
  685. /**
  686.  * @desc Load browsers capabilities from /data/browsers.xlm file
  687.  *
  688.  */
  689. function ifLoadBrowsers(){
  690.     // Set default values (see /bin/default/browsers.txt for explanations)
  691.     $default=array(
  692.         'name'=>'unknown',
  693.         'type'=>'computer',
  694.         'output'=>'html',
  695.         'async'=>true,
  696.         'asyncHTTPStreaming'=>true,
  697.         'frames'=>true,
  698.         'screenSize'=>'monitor',
  699.         'asyncRequest'=>'auto',
  700.         'fastAnim'=>true,
  701.         'flash'=>true,
  702.         'wmp'=>true,
  703.         'qt'=>true,
  704.         'qtReenc'=>true,
  705.         'externalM3U'=>true,
  706.         'playlistFormat'=>'m3u',
  707.         'vlc'=>true,
  708.         'divx'=>true,
  709.         'm3u'=>true,
  710.         //'standaloneMediaPlayer'=>false,
  711.         'png'=>true,
  712.         'theme'=>false,
  713.         'mobileTheme'=>false,
  714.         'clientPingInterval'=>8,
  715.         'drag'=>true,
  716.         'imgFadeSteps'=>5,
  717.         'download'=>true
  718.         );
  719.  
  720.     // Read browsers definition file
  721.     $tmp=@cfParse_ini_file(cfAppBinDir().'/default/browsers.txt',true,false);
  722.     $browsers=array();
  723.  
  724.     foreach ($tmp as $k=>$v){
  725.         // Set default values
  726.         $tmpb=$default;
  727.         // If browser inherits from another one
  728.         if(isset($v['inherit']) && isset($tmp[$v['inherit']])) foreach ($tmp[$v['inherit']] as $k2=>$v2) $tmpb[$k2]=$v2;
  729.         // Set properties
  730.         foreach ($v as $k2=>$v2) $tmpb[$k2]=$v2;
  731.         $browsers[$k]=$tmpb;
  732.     }
  733.  
  734.     // Add a default browser that will match everything
  735.     $browsers['Default']=$tmpb; $browsers['Default']['signature']='.';
  736.  
  737.     cfMSetVar('weezoBrowsers',$browsers);
  738. }
  739.  
  740. /**
  741.  * @desc Load weezo.net account registration info
  742.  *
  743.  */
  744. function ifLoadRegInfo(){
  745.      cfMSetVar('weezoRegInfo',(file_exists(cfAppDataDir().'/reg.ini'))?cfParse_ini_file(cfAppDataDir().'/reg.ini'):false);
  746. }
  747.  
  748. /**
  749.  * @desc Load sticky notes into weezoSNotes memory array
  750.  *
  751.  */
  752. function ifLoadSNotes(){
  753.     $maxId=0;
  754.     // Load from file
  755.     $weezoSNotes=(file_exists(cfAppDataDir().'/stickyNotes.ini'))?cfParse_ini_file(cfAppDataDir().'/stickyNotes.ini'):array();
  756.     // Check values
  757.     foreach ($weezoSNotes as $id=>$sNote) if(is_array($sNote)){
  758.         if(!is_numeric($id) || !isset($sNote['text'])){unset($weezoSNotes[$id]);continue;}
  759.         $maxId=max($maxId,$id);
  760.         if(!isset($sNote['x'])) $weezoSNotes[$id]['x']=rand(0,1);
  761.         if(!isset($sNote['y'])) $weezoSNotes[$id]['y']=rand(0,1);
  762.         if(!isset($sNote['color'])) $weezoSNotes[$id]['color']='EE99B7';
  763.         if(!isset($sNote['author'])) $weezoSNotes[$id]['author']='---';
  764.         if(!isset($sNote['recipient'])) $weezoSNotes[$id]['recipient']='all';
  765.     }
  766.     if(!isset($weezoSNotes['maxId'])) $weezoSNotes['maxId']=$maxId;
  767.     cfMSetVar('weezoSNotes',$weezoSNotes);
  768. }
  769.  
  770. /**
  771.  * @desc Create if needed files info cache database
  772.  *
  773.  */
  774. function ifSetFilesCacheDB(){
  775.     if(cfGGetVar('cacheFilesData') && !file_exists($db=cfAppDataDir().'/filesCache.db')){
  776.         $db=sqlite_open($db);
  777.         sqlite_query('CREATE TABLE dirs (id INTEGER PRIMARY KEY ASC, path KEY)',$db);
  778.         sqlite_query('CREATE TABLE files (dirId KEY ASC, filename TEXT KEY, mtime INTEGER, data TEXT, UNIQUE(dirId,filename))',$db);
  779.         sqlite_close($db);
  780.     }
  781. }
  782.  
  783. /**
  784.  * @desc Reset resources / users associations for all opened sessions
  785.  *         Called on new resource association, resource deletion, user creation/deletion/activation/deactivation
  786.  *
  787.  * @param bool $resetUsers: true to reload in-memory users
  788.  * @param bool $resetResources: true to reload in-memory resources
  789.  */
  790. function ifResetResourcesUsers($resetUsers=false,$resetResources=false){
  791.     $debug=false;
  792.  
  793.     // Reset in-memory resources from files
  794.     if($resetResources) ifLoadResources();
  795.     $resources=cfResourcesGetAll();
  796.  
  797.     // Reset in-memory users from files
  798.     if($resetUsers) ifLoadUsers();
  799.     $users=cfMGetVar('weezoUsers');
  800.  
  801.     // Stop current session so session file can be read
  802.     wSession_write_close();
  803.  
  804.     /**
  805.      * Foreach opened session
  806.      */
  807.     foreach (glob(wSession_save_path().'/sess_*') as $completeFilename){
  808.         // Get session data
  809.         $processedSess=@unserialize(file_get_contents($completeFilename));
  810.  
  811.         // If it's an user session
  812.         if(isset($processedSess['user']['name']) && isset($processedSess['accountIP']) && isset($processedSess['connectionTime'])){
  813.  
  814.             // Get session's user actual config
  815.             $userConfig=@$users[$processedSess['userId']];
  816.  
  817.             // Check that user is still existing / activated
  818.             if(!$userConfig // user not defined anymore
  819.             || !@$userConfig['activated'] // user not activated anymore
  820.             || !cfIPFilterCheck($processedSess,$processedSess['accountIP'])) // user's ip not allowed anymore for this group (note: general-defined IP ban/access is controled at every user's request so no need to recheck here)
  821.             {
  822.                 // Destroy user file
  823.                 @unlink($completeFilename);
  824.  
  825.                 // Proceed with next user file
  826.                 continue;
  827.             }
  828.  
  829.             // Used to see if an user's data must be saved
  830.             $processedSessModified=false;
  831.  
  832.             // Verify currently bound resources are still existing and bound to user
  833.             $maxSessShortID=0;
  834.             foreach ($processedSess['res'] as $sessShortID=>$sessData){
  835.                 // If resource doesnt exist anymore, remove
  836.                 if(!isset($resources[$sessData['id']])) {
  837.                     unset($processedSess['res'][$sessShortID]);
  838.                     $processedSessModified=true;
  839.                     continue;
  840.                 }
  841.                 // Check if resource is still bound to this user
  842.                 $nb=0; $found=false;
  843.                 while (isset($userConfig['resource'.$nb])) {
  844.                     if($userConfig['resource'.$nb]['file']==$resources[$sessData['id']]['resourceName'].'.res') {$found=true;break;}
  845.                     $nb++;
  846.                 }
  847.                 // If this resource has not been found for this user, remove
  848.                 if(!$found){
  849.                     unset($processedSess['res'][$sessShortID]);
  850.                     $processedSessModified=true;
  851.                     continue;
  852.                 }
  853.                 if($sessShortID>$maxSessShortID) $maxSessShortID=$sessShortID;
  854.             }
  855.  
  856.             // Check if new resources are still bound to this user
  857.             // Browse all user's resources
  858.             $nb=0;
  859.             while (isset($userConfig['resource'.$nb])) {
  860.                 $rfn=cfFileWithoutExtension($userConfig['resource'.$nb]['file']);
  861.                 $found=false;
  862.                 // Browse all bound resources to see if already bound
  863.                 foreach ($processedSess['res'] as $sessShortID=>$sessData){
  864.                     if($resources[$sessData['id']]['resourceName']==$rfn){$found=true;break;}
  865.                 }
  866.                 // If resource not already bound to user, add it
  867.                 if(!$found){
  868.                     $maxSessShortID++;
  869.                     foreach ($resources as $uniqueID=>$resourceData) if($resourceData['resourceName']==$rfn) {$uniqueID=$resourceData['id'];break;}
  870.                     $processedSess['res'][$maxSessShortID]=array(
  871.                         // unique ID
  872.                         'id'=>$uniqueID,
  873.                         'type'=>$resourceData['definition']['type'],
  874.                         'subType'=>$resourceData['definition']['subType'],
  875.                         'resourceIcon'=>$resourceData['definition']['resourceIcon'],
  876.                         // resourceJsLink
  877.                         'resourceJsLink'=>'openResource(\''.$resourceData['definition']['resourceScriptPath'].'/'.$resourceData['definition']['baseFile'].'\',\''.$maxSessShortID."','".
  878.                         str_replace('\\',"\\\\",str_replace("'","`",str_replace('"',""",cfUTF8Encode($resourceData['name']))))."','".
  879.                         $resourceData['definition']['resourceIcon']."',".
  880.                         ((isset($resourceData['defaultWindowHeight']))?$resourceData['defaultWindowHeight']:'0').",".
  881.                         ((isset($resourceData['defaultWindowWidth']))?$resourceData['defaultWindowWidth']:'0')  .",".
  882.                         ((isset($resourceData['winInnerWidth']))?$resourceData['winInnerWidth']:'0').",".
  883.                         ((isset($resourceData['winInnerHeight']))?$resourceData['winInnerHeight']:'0').
  884.                         ((@$resourceData['separateWindow']||@$resourceData['definition']['separateWindow'])?',1':',0').
  885.                         ')');
  886.  
  887.                     // Set background icons position according to iconPosition data
  888.                     //$activeItems[$uniqueID]=array('name'=>'resIcon_'.$uniqueID, 'type'=>'icon', 'x'=>null, 'y'=>null, 'resourceFilename'=>$temp['file']);
  889.                     $maxSessShortID++;
  890.                     $processedSessModified=true;
  891.                 }
  892.                 $nb++;
  893.             }
  894.  
  895.             // If a resource has been added or removed from processed session, update session
  896. if($debug && $processedSessModified) cfVarDump('UPDATE SESSION');
  897.  
  898.             //if($processedSessModified) file_put_contents($completeFilename,serialize($processedSess));
  899.             if($processedSessModified) {
  900.                 // Commit to file (3 retries, as session may lock file)
  901.                 while(file_put_contents($completeFilename,serialize($processedSess))===false && @$retries++<3) usleep(100000);
  902.             }
  903.         }
  904.     }
  905. }
  906.  
  907. /**
  908.  * @desc load user configuration file, language file, and computes a few things...
  909.  *             called by login.php on session start
  910.  * @param boolean $filterIP: true to remove users who may not be accessed by $_SERVER['REMOTE_ADDR']
  911.  * @return boolean true if no initialization critical problem, else exit
  912. */
  913. function ifInitializeSession($filterIP=true){
  914.  
  915.     // Reset logged user Id
  916.     if(isset($_SESSION['userId'])) unset($_SESSION['userId']);
  917.  
  918.     //Load users files
  919.     if(!isset($_ENV['users'])) $_ENV['users']=array();
  920.  
  921.     $_SESSION['res']=array();
  922.  
  923.     if(!isset($_SESSION['nbLoginAttempts'])) $_SESSION['nbLoginAttempts']=array();
  924.  
  925.     $dir=cfAppDataDir();
  926.  
  927.     $nb=0;
  928.     // Get all activated users, whose IP restriction policy matches, using general.ini for sorting
  929.     foreach (cfUsersConfigs() as $id=>$user){
  930.         if(!$user->getVar('activated') || 'false'===$user->getVar('activated')) continue;
  931.         // Check for included / excluded IPs
  932.         if($filterIP && $user->getVar('IPFilter') && $user->getVar('IPFilter')!='no'){
  933.             if($user->getVar('IPFilter')=='include'){
  934.                 if(!$user->getVar('IPFilterIncluded')) continue;
  935.                 else{
  936.                     $match=false;
  937.                     foreach (explode(';',$user->getVar('IPFilterIncluded')) as $ip) if(cfIPMatch($ip)) $match=true;
  938.                     if(!$match)  continue;
  939.                 }
  940.             }
  941.             else{
  942.                 if($user->getVar('IPFilterExcluded')){
  943.                     $match=false;
  944.                     foreach (explode(';',$user->getVar('IPFilterExcluded')) as $ip) if(cfIPMatch($ip)) {$match=true; break;}
  945.                     if($match) continue;
  946.                 }
  947.             }
  948.         }
  949.  
  950.         // Add user to loaded users list
  951.         $_ENV['users'][$id]=$user->getData();
  952.     }
  953.     if(isset($_SESSION['temp'])) unset($_SESSION['temp']); // ?
  954.  
  955.     // Set language
  956.     if(isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) && strlen($_SERVER['HTTP_ACCEPT_LANGUAGE'])>1){
  957.         if(cfMIssetVar('weezoLng'.substr($_SERVER['HTTP_ACCEPT_LANGUAGE'],0,2))) cfGSetVar('language',substr($_SERVER['HTTP_ACCEPT_LANGUAGE'],0,2));
  958.     }
  959.     return true;
  960. }
  961.  
  962. /**
  963.  * @desc initialize server data :
  964.  * Script launched at first server query
  965.  *
  966.  * Load general.ini into memory
  967.  * Start Weezo if not started
  968.  * Create statistics database if not-existing
  969.  * Perform updates if found
  970.  */
  971. function ifInitializeServer(){
  972.     // Ignore user abort as function can be asynchronously called (and aborted) from Weezo.exe
  973.     ignore_user_abort(true);
  974.  
  975.     // Don't send log info to application
  976.     $_ENV['dontLogToApp']=1;
  977.  
  978.     // Lock access to all scripts while initialization is not completed
  979.     cfMSetVar('weezoInitInProgress',1);
  980.  
  981.     // Load general.ini in memory
  982.     ifLoadGeneral();
  983.     @unlink(cfAppDocRoot().'/signedScript.php');
  984.  
  985.     // Kill CMD consol launched by Weezo (to set path env) as it's not anymore usefull
  986.     ifKillParentCmd();
  987.  
  988.     // Load resources definitions in memory
  989.     ifResourcesDefinitions();
  990.  
  991.     // Load resources configuration in memory
  992.     ifLoadResources();
  993.  
  994.     // Load user files in memory
  995.     ifLoadUsers();
  996.  
  997.     // Load languages list into memory
  998.     // weezoLngXX memory data is set to false when language exists but has not yet been requested, and to language array on 1st request
  999.     foreach (glob(cfAppDocRoot().'/includes/lng/*.php') as $value)    cfMSetVar('weezoLng'.cfFileWithoutExtension(basename($value)),false);
  1000.  
  1001.     // Create if needed files info cache database
  1002.     ifSetFilesCacheDB();
  1003.  
  1004.     // Load themes data in memory
  1005.     ifLoadThemes();
  1006.  
  1007.     // Load icons location in memory
  1008.     ifLoadIcons();
  1009.  
  1010.     // Load browsers capabilities in memory
  1011.     ifLoadBrowsers();
  1012.  
  1013.     // Load weezo.net account registration info
  1014.     ifLoadRegInfo();
  1015.  
  1016.     // Load sticky notes
  1017.     ifLoadSNotes();
  1018.  
  1019.     // Destroy unused session files
  1020.     $sess_save_path=cfAppDataDir().'/sessiondata';
  1021.     //if(isset($_ENV['weezoGeneral']['sessionHandler']) && $_ENV['weezoGeneral']['sessionHandler']=='memory') wSessionGc(0);
  1022.  
  1023.     // (re)launch Weezo if not launched
  1024.     if(!cfProcessExists('Weezo.exe')) {
  1025.         //if(cfGGetVar('startWithWindows')=='service') customExecFork('net','SW_HIDE', 'start Weezo');
  1026.         //else customExecFork(cfAppBinDir().'/weezo.exe','SW_SHOWNORMAL', '-minimized');
  1027.     }
  1028.  
  1029.     // Create / update statistics database
  1030.     require_once(INCLUDE_DIR.'databaseFunctions.php');
  1031.     dbCreateDB();
  1032.  
  1033.     // perform updates
  1034.     if(file_exists(cfAppDocRoot().'/includes/updateScript.php')) include_once(INCLUDE_DIR.'updateScript.php');
  1035.  
  1036.     if(!cfMIssetVar('weezoTransfersLastUpdate')) cfMSetVar('weezoTransfersLastUpdate',time().'.'.microtime());
  1037.  
  1038.     // Clear APC cache
  1039.     if(function_exists('apc_clear_cache')) @apc_clear_cache();
  1040.  
  1041.     // Clean too-long log files
  1042.     if(cfGGetVar('accessLogMaxSize') && is_file(cfAppLogDir().'/access.log')){
  1043.         if(filesize($cfn=cfAppLogDir().'/access.log')>cfGGetVar('accessLogMaxSize')){
  1044.             if($fp=@fopen($cfn,'r+')) {@ftruncate($fp,cfGGetVar('accessLogMaxSize'));@fclose($fp);}
  1045.         }
  1046.     }
  1047.  
  1048.  
  1049.     // Unlock scripts access
  1050.     cfMUnsetVar('weezoInitInProgress');
  1051.  
  1052.     // 1st server config: log
  1053.     if(!cfMGetVar('weezoInitialized')){
  1054.         // Indicate server has been initialized once
  1055.         cfMSetVar('weezoInitialized',1);
  1056.     }
  1057. }
  1058. ?>
  1059.